import { DateFormatEnum } from 'src/common/constants';

export class DateTimeFormatter {
  /**
   * 将数据库中的 UTC ISO 字符串或日期对象格式化为指定格式的字符串（默认格式为 DateFormatEnum.DEFAULT）。
   * 使用 UTC 时间进行格式化以确保与数据库存储时间一致。
   */
  static fromDatabaseFormat(value: string | Date | null, formatString: string = DateFormatEnum.DEFAULT): string | null {
    if (!value) return null;

    const date = this.parseValue(value);
    if (!this.isValidDate(date)) return null;

    return this.formatUTC(date, formatString);
  }

  /**
   * 解析输入值为 Date 对象，支持 Date 实例或 ISO 格式字符串
   */
  private static parseValue(value: Date | string): Date | null {
    if (value instanceof Date) return value;
    if (typeof value === 'string') return new Date(value);
    return null;
  }

  /**
   * 使用 UTC 时间进行日期格式化
   */
  private static formatUTC(date: Date, formatString: string): string {
    return formatString.replace(/yyyy|MM|dd|HH|mm|ss/g, (match) => {
      switch (match) {
        case 'yyyy':
          return date.getUTCFullYear().toString();
        case 'MM':
          return this.pad(date.getUTCMonth() + 1);
        case 'dd':
          return this.pad(date.getUTCDate());
        case 'HH':
          return this.pad(date.getUTCHours());
        case 'mm':
          return this.pad(date.getUTCMinutes());
        case 'ss':
          return this.pad(date.getUTCSeconds());
        default:
          return match;
      }
    });
  }

  /**
   * 数字补零操作
   */
  private static pad(n: number): string {
    return n.toString().padStart(2, '0');
  }

  /**
   * 验证日期对象是否有效
   */
  private static isValidDate(date: Date | null): date is Date {
    return !!date && !isNaN(date.getTime());
  }
}

export const TimeTransformer = {
  to: (value: Date | string | null) => value,
  from: (value: string | Date | null) => DateTimeFormatter.fromDatabaseFormat(value),
};
